INTERBASE: Deadlock pri konkurecnim pristupu k temuz radku tabuly
Otázka od: Petr Vařeka
2. 10. 2002 17:28
Zdravim konferu, ktera jiz 2 krat pomohla vyresit me problemy.
Mam nasledujici problem:
Aplikace se chova nasledovne:
1) Po prirazeni SelectSQL =
'Update tab Set tab.col1 = "hodn1" where pk
="hodnpk" '
do IBdatasetu, spusti pri aktivni transakci metodu IBdataSet.ExecSQL.
2) Spustim-li dalsi instanci teze aplikace a pokusim se provest tutez
operaci nad tymz radkem teze tabulky,
debugger ukaze, ze program counter se zastavi na radku IBdataSet.ExecSQL a
dojde ke zmrznuti teto
instance.
3)
a) Provedu-li v prvni instanci aplikace IBTransaction.Rollback, druha
instance "rozmrzne" a
dojde k dokonceni IBdataSet.ExecSQL.
b) Provedu-li vsak v prvni instanci aplikace IBTransaction.Commit, druha
instance taky "rozmrzne" a
dojde k vyjimce EIBInterBaseError with message
"Deadlock update
conflict with concurent update".
Potreboval bych osetrit, aby nedochazelo k vyse popsanemu zmrznuti a abych
tudiz mohl vyjimku osetrit ihned
jak nastane. Na updatovanem radku je zrejme nejaky zamek, ktery pozdrzi
konkurencni proces; zajimalo by
me, jak se stav tohoto zamku da osetrit jeste pred provedenim
IBdataSet.ExecSQL.
S pozdravem Petr Vareka
Odpovedá: Pavel Cisar
2. 10. 2002 19:51
Haj hou!
On 2 Oct 2002 at 18:26, Petr Vařeka wrote:
> Potreboval bych osetrit, aby nedochazelo k vyse popsanemu zmrznuti a abych
> tudiz mohl vyjimku osetrit ihned
> jak nastane. Na updatovanem radku je zrejme nejaky zamek, ktery pozdrzi
> konkurencni proces; zajimalo by
> me, jak se stav tohoto zamku da osetrit jeste pred provedenim
> IBdataSet.ExecSQL.
Komponent IBTransaction ma parametry, ktere lze nejlepe nastavit pres
komponent editor. Vyber si nejakou izolacni urovel, dle prikladu co jsi
uvedl by bylo nejlepsi Read Committed. Do okna se seznamem parametru by
se melo doplnit spolu s dalsimi parametry rovnez "nowait" (pokud ne, tak
prepis wait na nowait, pripadne nowait dopln).
S pozdravem
Pavel Cisar
Mobil: 0724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase